package com.xzh.rxjava;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

/**
 * 作者 ： xiezhihui on 2018\8\14 0014.
 * Q Q ： 347649749
 * 微信 ： LOVE347649749
 * 作用 ：RxJava 操作符的使用 转换操作符 Map 和 FlatMap
 */

public class MapRxJavaActivity extends AppCompatActivity{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_rxjava_layout);

//        userFunctionSymbolMap();
        userFunctionSymbolFlatMap();
    }

    /** 将一个发送数据的 Observable 转化成多个发送数据的Observable，然后将数据合并之后返回。 **/
    private void userFunctionSymbolFlatMap() {
        /** 由一个数据源UserParam 不停地转变成多个数据源，最后得出结果，这种做饭就像是多个请求结果用来满足最后一个请求。 **/
        Observable.just(getUserParam())
                .flatMap(new Function<UserParam, ObservableSource<BaseResult>>() {
                    @Override
                    public ObservableSource<BaseResult> apply(UserParam userParam) throws Exception {
                        BaseResult baseResult = getBaseResult();
                        return Observable.just(baseResult);
                    }
                }).flatMap(new Function<BaseResult, ObservableSource<User>>() {

            @Override
            public ObservableSource<User> apply(BaseResult baseResult) throws Exception {
                User user = getUser();
                return Observable.just(user);
            }
        }).subscribeOn(Schedulers.io()).subscribe(new Consumer<User>() {
            @Override
            public void accept(User user) throws Exception {
                /** subscribeOn(Schedulers.io()) 把前面几步放到io线程中执行，因为是请求网络的耗时操作。 **/
                Log.e("user",user.toString());
            }
        });
    }

    private User getUser(){
        User user =  new User("1000","小米",1,"软件1班",98.5f);
        return user;
    }
    private UserParam getUserParam(){
        UserParam param = new UserParam("15845","小米");
        return param;
    }

    private BaseResult getBaseResult(){
        BaseResult baseResult = new BaseResult("1","success");
        return baseResult;
    }
    /** 将一个发射数据的Observable , 转换为另一个想要的数据类型的Observavle **/
    private void userFunctionSymbolMap() {
        /** 1、创建一个原始的Observable **/
        Observable observable = Observable.just(123);

        /** 创建一个转换Observable **/
        Observable<String> changeObservable = observable.map(new Function<Integer,String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                /** Function 参数 ： 第一个传进来的参数，第二个是需要转换的参数，
                 * 也可以是其他类型的比如一个Bean，或则返回一个Obsevable都可以 **/
                return "("+integer+")是转换后的字符串";
            }

        });

        changeObservable.subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {

            }
        });
    }
}
